<?php
$key = ftok('test.php', 's');
// 同时最多只能有一个进程进入临界区
$sem_id = sem_get($key, 1);
echo "欢迎来到公共厕所，本厕所只能容纳一个人\n\n";
// 派生子进程
$pid = pcntl_fork();
if ($pid == -1) {
    exit(1);
} else if ($pid > 0) {
    // 父进程
    $name = '爸爸';
} else {
    // 子进程
    $name = '儿子';
}
echo "我是{$name}，我要上厕所\n";
sem_acquire($sem_id);
// 原子操作开始
echo "我是{$name}，我在厕所里，外面的人慢慢等吧\n";
sleep(10);
echo "我是{$name}，我离开了厕所\n";
// 原子操作结束
sem_release($sem_id);
if ($pid > 0) {
    pcntl_waitpid($pid, $status);
    sem_remove($sem_id);
}